定位

全局 Location API 提供对设备地理位置信息的访问能力,包括一次性定位、逆地理编码、用户手动选点、定位精度控制、以及用于小组件的权限检测等功能。


功能概览

你可以通过该 API 实现以下功能:

  • 获取设备当前位置(支持缓存)
  • 用户通过地图界面手动选择位置
  • 将经纬度转换为可读的地址(逆地理编码)
  • 设置定位精度(耗电量和等待时间可控)
  • 检查小组件是否获得定位权限

注意: 该 API 为全局 API,无需额外导入。


接口文档

Location.isAuthorizedForWidgetUpdates(): Promise<boolean>

检查小组件是否拥有获取定位更新的权限。

1const isAuthorized = await Location.isAuthorizedForWidgetUpdates()
2if (!isAuthorized) {
3  console.log("小组件没有获取定位的权限")
4}

Location.setAccuracy(accuracy: LocationAccuracy): Promise<void>

设置期望的定位精度。精度越高,耗电和等待时间也可能增加。

可选值

精度值 描述
"best" 最高可用精度
"tenMeters" 10 米以内
"hundredMeters" 100 米以内
"kilometer" 1 公里以内
"threeKilometers" 3 公里以内
1await Location.setAccuracy("hundredMeters")

Location.requestCurrent(options?: { forceRequest?: boolean }): Promise<LocationInfo | null>

请求一次设备当前的位置信息。

默认情况下,如果存在缓存位置(例如启动时从系统获取到的位置),将立即返回该缓存值。如果未缓存,则会触发新的定位请求。

你可以通过传入 { forceRequest: true } 强制跳过缓存,始终发起新请求。

参数

参数名 类型 是否必填 描述
forceRequest boolean 若为 true,将忽略缓存,始终发起新的定位请求。
1const location = await Location.requestCurrent({ forceRequest: true })
2if (location) {
3  console.log("纬度:", location.latitude)
4  console.log("经度:", location.longitude)
5  console.log("时间戳:", location.timestamp)
6}

Location.pickFromMap(): Promise<LocationInfo | null>

打开内置地图界面,允许用户手动选择一个位置。

1const selected = await Location.pickFromMap()
2if (selected) {
3  console.log("用户选择的位置:", selected.latitude, selected.longitude)
4}

Location.reverseGeocode(options): Promise<LocationPlacemark[] | null>

将经纬度转换为人类可读的地理信息(如街道、城市、国家等)。

参数

字段 类型 是否必填 描述
latitude number 纬度(单位:度)
longitude number 经度(单位:度)
locale string 可选语言区域(如 "zh-CN"),默认使用设备语言设置
1const placemarks = await Location.reverseGeocode({
2  latitude: 31.2304,
3  longitude: 121.4737,
4  locale: "zh-CN"
5})
6
7if (placemarks?.length) {
8  const place = placemarks[0]
9  console.log("城市:", place.locality)
10  console.log("国家:", place.country)
11}

类型定义

LocationAccuracy

表示定位精度选项:

1type LocationAccuracy =
2  | "best"
3  | "tenMeters"
4  | "hundredMeters"
5  | "kilometer"
6  | "threeKilometers"

LocationInfo

表示一个带有时间戳的地理坐标点:

1type LocationInfo = {
2  /**
3   * 纬度,单位:度
4   */
5  latitude: number
6  /**
7   * 经度,单位:度
8   */
9  longitude: number
10  /**
11   * 获取该位置的时间戳(单位:毫秒)
12   */
13  timestamp: number
14}

LocationPlacemark

表示一个可读的地理位置,通常由逆地理编码返回,包含详细的地址结构信息:

1type LocationPlacemark = {
2  location?: LocationInfo
3  region?: string
4  timeZone?: string
5  name?: string
6  thoroughfare?: string
7  subThoroughfare?: string
8  locality?: string
9  subLocality?: string
10  administrativeArea?: string
11  subAdministrativeArea?: string
12  postalCode?: string
13  isoCountryCode?: string
14  country?: string
15  inlandWater?: string
16  ocean?: string
17  areasOfInterest?: string[]
18}

字段说明

字段 类型 描述
location LocationInfo 坐标点信息(通常等于请求的经纬度)
region string 区域名,如省/州
timeZone string 时区标识(如 "Asia/Shanghai"
name string 地点名称,如建筑物、地标等
thoroughfare string 街道名称,如 "中关村大街"
subThoroughfare string 详细地址,如门牌号
locality string 城市或镇
subLocality string 区、街道等子区域
administrativeArea string 省份、州或其他一级行政区域
subAdministrativeArea string 县、区等次级行政区域
postalCode string 邮政编码
isoCountryCode string 国家代码(ISO 3166-1 alpha-2,如 "CN"
country string 国家全名,如 "中国"
inlandWater string 附近的内陆水体名称,如湖泊、河流
ocean string 附近的海洋名称
areasOfInterest string[] 附近的兴趣点/地标数组,如 "东方明珠"

示例用法

逆地理编码

1const placemarks = await Location.reverseGeocode({
2  latitude: 39.9042,
3  longitude: 116.4074,
4  locale: "zh-CN"
5})
6
7if (placemarks?.length) {
8  const place = placemarks[0]
9  console.log("国家:", place.country)
10  console.log("城市:", place.locality)
11  console.log("街道:", place.thoroughfare, place.subThoroughfare)
12  console.log("地标名称:", place.name)
13  console.log("邮编:", place.postalCode)
14  console.log("兴趣点:", place.areasOfInterest?.join(", "))
15}

地址格式化工具

1function formatAddress(p: LocationPlacemark): string {
2  return [
3    p.country,
4    p.administrativeArea,
5    p.locality,
6    p.subLocality,
7    p.thoroughfare,
8    p.subThoroughfare
9  ].filter(Boolean).join(", ")
10}

最佳实践与使用建议

  • 使用 areasOfInterestname 显示更友好的位置信息(如地标名)
  • 使用 postalCodelocalityadministrativeArea 自动填写表单或记录标签
  • 使用 timestamp 判断位置数据是否新鲜
  • 使用 timeZone 进行本地时间转换或事件提醒
  • 在调用 requestCurrent 前使用 setAccuracy 控制精度
  • 对小组件使用 isAuthorizedForWidgetUpdates() 检查权限

说明

  • 逆地理编码可能返回多个结果,通常第一个最相关
  • 若获取失败,API 将返回 null
  • 若未强制刷新,系统会优先使用缓存位置,响应更快
  • 小组件受限于系统权限机制,务必检测权限状态